前回の記事が見えないままですので説明すると、Ruby-GetText-Packageを使ってTypoをi18n化し始めたのは良いけれど、最初にページを表示したクライアントの言語でキャッシュされてしまい困っている、という感じだったはず。結局ApplicationControllerクラスにて、@params[:lang]にLocale.current.languageで得られる値を代入するメソッドをbefore_filterで指定することで対処しました。Typoやvendorディレクトリ以下に含まれるコードを見て回りましたが、この方法が今のところわかりやすくて簡潔っぽい。
現在のApplicationControllerクラスの差分はこんな感じ:
Index: application.rb
===================================================================
--- application.rb (リビジョン 1055)
+++ application.rb (作業コピー)
@@ -1,3 +1,5 @@
+require 'gettext/rails'
+
# The filters added to this controller will be run for all controllers in the application.
# Likewise will all the methods added be available for all controllers.
class ApplicationController < ActionController::Base
@@ -9,6 +11,9 @@
around_filter Blog
+ init_gettext 'ti18n'
+ before_filter :set_language_parameter
+
protected
def fire_triggers
@@ -51,6 +56,10 @@
end
helper_method :this_blog
+ def set_language_parameter
+ @params[:lang] ||= Locale.current.language
+ end
+
def self.include_protected(*modules)
modules.reverse.each do |mod|
included_methods = mod.public_instance_methods.reject do |meth|before_filterの行と、set_language_parameterメソッドが今回追加した部分です。こんな感じですがいかがでしょうか。ちなみに相変わらずメソッド名が一番悩みました。
動作確認のため、ページの一番下に関係しそうなメソッドの戻り値を表示しています。ブラウザの言語設定を切り替えるとここの値も同期して変化するはずです。よろしければお試しください。


コメント
コメントを書く